SharedPreferences
一种比较轻量级的键值对存储,创建后文件会在 shared_prefs 里面添加一个 xml,所以又叫 xml 存储,增删改查都很方便快捷不需要操作工具类代码实现也相对简单,使用场景是作为一些小数据的存储 比较常规的比如记住密码,地理信息的保存 或者临时标识的保存
位置: data/data/包名/shared_prefs
优点:
- 轻量级,以键值对的方式进行存储,使用方便,易于理解
- 采用的是 xml 文件形式存储在本地,程序卸载后会也会一并被清除,不会残留信息。
缺点:
- 由于是对文件 IO 读取,因此在 IO 上的瓶颈是个大问题。
- 多线程场景下效率比较低,因为 get 操作的时候,会锁定 SharedPreferencesImpl 里面的对象,互斥其他操作,而当 put、commit() 和 apply() 操作的时候都会锁住 Editor 的对象,这样的情况下,效率会降低。
- 不支持跨进程通讯。
- 由于每次都会把整个文件加载到内存中,因此,如果 SharedPreferences 文件过大,或者在其中的键值对是大对象的 json 数据则会占用大量内存,读取较慢是一方面,同时也会引发程序频繁 GC,导致的界面卡顿。
使用建议:
- 不要存储较大数据或者较多数据到 SharedPreferences 中。
- 键值对不宜过多。
- 频繁修改的数据修改后统一提交,而不是修改过后马上提交。
- 在不需要返回值的情况下,使用 apply() 方法可以极大的提高性能。
- 在跨进程通讯中不去使用 SharedPreferences ,可以使用 mmkv 。
文件存储
关于文件存储,Activity 提供了 openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在 J2SE 环境中保存数据到文件中是一样的。文件可用来存放大量数据,如文本、图片、音频等,默认是私有的。所以在使用过程中需注意权限问题。
默认位置: /data/data/<包>/files/.
SQLite 数据库
SQLite 是轻量级嵌入式数据库引擎,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。 适用于存储一些复杂的关系型数据。
位置: data/<项目文件夹>/databases/
优点:
- 效率高,利用很少的内存就有很好的性能
- 非常适合存储结构化数据
- 方便在不同的 Activity,甚至不同的应用之间传递数据
ContentProvider
ContentProvider 不能算是一种数据存储方式。它只是给我们提供操作数据的接口,Content Provider 背后其实还是 SQLite、File I\O 等其他方式。
一个程序可以通过实现一个 ContentProvider 的抽象接口将自己的数据完全暴露出去,而且 ContentProviders 是以类似数据库中表的方式将数据暴露,也就是说 ContentProvider 就像一个“数据库”。那么外界获取其提供的数据,也就应该与从数据库中获取数据的操作基本一样,只不过是采用 URI 来表示外界需要访问的“数据库”。
Android 提供了一些已经在系统中实现的标准 Content Provider,比如联系人信息,图片库等等,你可以用这些 ContentProvider 来访问设备上存储的联系人信息,图片等等。
应用场景: 增删改查其他应用程序中私有数据。
网络存储
网络存储其实算是服务器存储了,与客户端没有太大关系。
参考文章:
谈谈 SharedPreferences 的优缺点?以及使用
Android 数据存储五种
[越努力,越幸运!]